package liangtWorkSpace.simple;

/**
 * @ClassName Reverse
 * @Description : 整数反转
 * @Author : LiangT
 * @Date : 2020/6/11 16:19
 */
public class Reverse {

    /**
     * 判断是否是负数
     * 利用StringBuffer的reverse方法进行字符串反转
     *
     * @param x
     * @return
     */
    public int reverse1(int x) {
        String str = Integer.toString(x);
        int flag = 1;
        if (x < 0) {
            flag = -1;
            str = str.substring(1);
        }
        try {
            return Integer.valueOf(new StringBuffer(str).reverse().toString()) * flag;
        } catch (Exception e) {
            return 0;
        }
    }

    /**
     * 除10取余方式，将余数乘10放置到新的数字中，最后将尝试取整
     * @param x
     * @return
     */
    public int reverse2 ( int x){
       long n = 0;

       while (x!= 0){
           n = n*10 + x%10;
           x = x/10;
       }
       return (int)n==n?(int)n:0;
    }

    /**
     * 二进制反转
     * @param x
     * @return
     */
    public int reverse3(int x){
        return Integer.reverse(x);
    }
    /**
     * 二进制反转 源码实现
     * @param n
     * @return
     */
    public int revers4(int n){
        n = (n & 0x55555555) << 1 | (n >>> 1) & 0x55555555;
        n = (n & 0x33333333) << 2 | (n >>> 2) & 0x33333333;
        n = (n & 0x0f0f0f0f) << 4 | (n >>> 4) & 0x0f0f0f0f;
        n = (n << 24) | ((n & 0xff00) << 8) |
                ((n >>> 8) & 0xff00) | (n >>> 24);
        return n;
    }
}
